//
//  StatusListViewModel.swift
//  weibo
//
//  Created by cmh on 15/9/6.
//  Copyright © 2015年 cmh. All rights reserved.
//

import UIKit
import ReactiveCocoa
import SDWebImage

// 微博列表视图模型
class StatusListViewModel: NSObject {
    
//    lazy var statuses: [AnyObject] = [StatusRowViewModel]()
    
    lazy var statuses = [StatusRowViewModel]()

    // 加载微博数据
    func loadStatusData(isPullupRefresh isPullupRefresh: Bool) -> RACSignal {
        
        // 初始刷新: statuses 数组没有内容
        // 下拉刷新: 取 statuses 的第一项的 id 作为 since_id
        var since_id = statuses.first?.status.id ?? 0
    
        var max_id = 0
        
        // 上拉刷新: 取 statuses 的最后一项的 id 作为 max_id
        if isPullupRefresh {
            since_id = 0
            max_id = statuses.last?.status.id ?? 0
        }
        
        
       return RACSignal.createSignal({ [weak self] (subscriber) -> RACDisposable! in
           
            NetWrokTools.shareTools.loadStatus(since_id: since_id, max_id: max_id).subscribeNext({ (result) -> Void in
                
                // 1. 获取 result 中的 statuses 字典数组
                guard let array = result["statuses"] as? [[String: AnyObject]] else {
                    printLog("没有正确的数据")
                    return
                }
                
                var arrayM = [StatusRowViewModel]()
                
                // 遍历数组
                for dict in array {
                    arrayM.append(StatusRowViewModel(status: Status(dict: dict)))
                }
                
                printLog("刷新到 \(arrayM.count) 条微博")
                
                self?.cacheWebImage(arrayM) {
                    
        
                    if max_id > 0 {  // 上拉刷新，新数据拼接在先有数据的后面
                        self?.statuses += arrayM
                    }else {             // 初始刷新/下拉刷新
                        self?.statuses = arrayM + self!.statuses
                    }
                    
                    // 下拉刷新，提示用户
                    if since_id > 0 {
                        subscriber.sendNext(arrayM.count)
                    }
                    
                    // 通知方法，数据加载完成
                    subscriber.sendCompleted()
                }
                
                }, error: { (error) -> Void in
                    
                    subscriber.sendError(error)
                    
                }) {}
           
            return nil
        })
        
        }
    
    // 缓存网络图片
    private func cacheWebImage(array: [StatusRowViewModel], finished: () -> ()) {
    
        // 定义调度组
        let group = dispatch_group_create()
        // 记录图像大小
        var dataLength = 0
        
        // 遍历微博数据
        for viewModel in array {
            
            let count = viewModel.thumbnailURLs?.count ?? 0
            
            if count != 1 {
            
                continue
            }
      
            // 入组
            dispatch_group_enter(group)
            
            // 缓存图片
            SDWebImageManager.sharedManager().downloadImageWithURL(viewModel.thumbnailURLs![0], options: [], progress: nil, completed: { (image, _, _, _, _) in
                
                //                // 代码执行到此，图片已经缓存完成，不一定有 image
                if image != nil {
                    // 将 image 转换成二进制数据
                    let data = UIImagePNGRepresentation(image)
                    
                    dataLength += data?.length ?? 0
                   
                }
                
                // 出组
                dispatch_group_leave(group)
            })
        }
        
        // 调度组监听
        dispatch_group_notify(group, dispatch_get_main_queue()) {
            
            printLog("缓存图像完成 \(dataLength / 1024) K")
            
            finished()
        }

   }

}
